1 תוכנה 1 תרגול מספר 10: תרגיל חזרה חברת הייטק בית הספר למדעי המחשב אוניברסיטת תל אביב 1
2 חברת הייטק בתרגיל זה נתרגל מספר נושאים אותם למדנו בשיעורים האחרונים: עיצוב ובניית מודל המורכב ממחלקות לתיאור סביבה מסוימת מנשקים, מחלקות מופשטות וירושה אוספים במסגרת התרגיל נכתוב תכנית לחישוב שכר בחברת הייטק המורכבת ממספר סוגים של עובדים.
3 עצבו מחלקות לייצוג עובדים בחברה על פי המפרט הבא: בחברת הייטק מצליחה ישנם 3 סוגי עובדים: תוכניתנים בודקי תוכנה מנהלים. לכל עובד יש שם, מזהה מספרי ובוס כל עובד מקבל משכורת. )מסוג מנהל(. לכל מנהל יש רשימה של עובדים אותם הוא מנהל. לכל תוכניתן יש שפת תכנות מועדפת )מתוך רשימה אפשרית(
4 המשך המפרט: תוכניתנים ובודקי תוכנה מקבלים שכר בסיס אישי בודקי תוכנה מקבלים גם בונוס על כל באג שמצאו השבוע )בונוס אחיד לכל הבודקים פר באג(. שכרו של כל מנהל נקבע כמספר העובדים שהוא מנהל ישירות * פקטור אישי.
5 עוד דרישות: כתבו תכנית המייצרת אובייקטים של עובדים עם נתונים אקראיים ושומרת אותם בשלוש רמות היררכיות לפי הפירוט הבא: בראש ההיררכיה נמצא המנכ"ל שהינו מנהל מתחתיו בהיררכיה יש 5 מנהלים מתחת לכל מנהל מצויים בהיררכיה 10 תכניתנים או בודקי תוכנה )בהסתברות שווה(. לאחר מכן, התוכנית תדפיס את פרטי 3 העובדים עם המשכורת הגבוהה ביותר בכל רמה היררכית.
6 דוגמא לפלט: CEO: ID: 1 Name: Taylor Zuckerberg Boss: None Salary: 49740.43 Employees: 5 Managers: ID: 13 Name: Kate Hewlett Boss: Taylor Zuckerberg Salary: 30395.94 Employees: 10 ID: 24 Name: Shlomo Noyce Boss: Taylor Zuckerberg Salary: 29222.68 Employees: 10 ID: 35 Name: Kate Filo Boss: Taylor Zuckerberg Salary: 25677.13 Employees: 10 Team members: ID: 32 Name: Max Noyce Boss: Kate Hewlett Salary: 20675.38 Language: Java ID: 40 Name: Lucy Jobs Boss: Max Ballmer Salary: 19595.35 Language: C++ ID: 16 Name: Imen Moore Boss: Shlomo Noyce Salary: 19509.67 Language: Ruby
7 נתחיל?
8 מה ידוע עד כה? 3 סוגי עובדים: תוכניתנים בודקי תוכנה מנהלים. לכל עובד יש שם, מזהה מספרי ובוס )מסוג מנהל(. כל עובד מקבל משכורת. לכל מנהל יש רשימה של עובדים אותם הוא מנהל. לכל תוכניתן יש שפת תכנות מועדפת )מתוך רשימה אפשרית(
9 המשך המפרט: תוכניתנים ובודקי תוכנה מקבלים שכר בסיס אישי בודקי תוכנה מקבלים גם בונוס על כל באג שמצאו השבוע )בונוס אחיד לכל הבודקים פר באג(. שכרו של כל מנהל נקבע כמספר העובדים שהוא מנהל ישירות * פקטור אישי.
10 המשך המפרט: תוכניתנים ובודקי תוכנה מקבלים שכר בסיס אישי בודקי תוכנה מקבלים גם בונוס על כל באג שמצאו השבוע )בונוס אחיד לכל הבודקים פר באג(. שכרו של כל מנהל נקבע כמספר העובדים שהוא מנהל ישירות * פקטור אישי.
11 המשך המפרט: תוכניתנים ובודקי תוכנה מקבלים שכר בסיס אישי בודקי תוכנה מקבלים גם בונוס על כל באג שמצאו השבוע )בונוס אחיד לכל הבודקים פר באג(. שכרו של כל מנהל נקבע כמספר העובדים שהוא מנהל ישירות * פקטור אישי.
12 המשך המפרט: תוכניתנים ובודקי תוכנה מקבלים שכר בסיס אישי בודקי תוכנה מקבלים גם בונוס על כל באג שמצאו השבוע )בונוס אחיד לכל הבודקים פר באג(. שכרו של כל מנהל נקבע כמספר העובדים שהוא מנהל ישירות * פקטור אישי.
13 המידול הנאיבי
14 Duplicate Code המידול הנאיבי
15 1. Simpler concrete classes 2. Reduced dependency (less connections between classes) שלב 1 עובד אבסטרקטי 2. 1.
16 שלב 1 עובד אבסטרקטי 1. Another opportunity for re-use
17 שלב 2 עובדים בצוות 1. base-pay logic is encapsulated in one class 2. re-use that logic when possible
18 שלב 3 ahead?plan )אופציונאלי( לפנינו מבנה היררכי )עץ( ייתכן שנרצה לעבור על המבנה בצורה אחידה נבצע שינוי פשוט במחלקות כך שלכולם יהיה,getEmployees ואלה שאינם מנהלים יחזירו null )מזכיר מאוד תבנית עיצוב שנקראת )Composite
19 שלב 3 ahead?plan )אופציונאלי(
20 מה הלאה? לכתוב קוד! נעבור רק על החלקים המרכזיים שאר הקוד באתר public interface Employee { public int getid(); public String getname(); public Manager getboss(); public double getsalary();
21 public abstract class AbstractEmployee implements Employee { private int id; private String name; private Manager boss; עוד קוד public AbstractEmployee(int id, String name, Manager boss) { this.id = id; this.name = name; this.boss = boss; @Override public int getid() { return id; @Override public String getname() { return name; @Override public Manager getboss() { return boss;
22 Enumerated types public enum Language { C, CPP, Java, Python, Ruby; public enum Language { C("C"), CPP("C++"), Java("Java"), Python("Python"), Ruby("Ruby"); private final String displayname; private Language(String name) { displayname = name; @Override public String tostring() { return displayname; וריאציה יותר מתוחכמת, הכוללת הגדרת שדות ומתודות
23 Enumerated types - usage public class Programmer extends TeamMember { private Language preferredlanguage; public Programmer(int id, String name, Manager boss, double wage, Language preferredlanguage) { super(id, name, boss, wage); this.preferredlanguage = preferredlanguage; public Language getpreferredlanguage() { return preferredlanguage;
24 פרטי מימוש... נרצה לוודא כי לעובד יש אין בעיה מצד העובד רק מנהל אחד. )משתנה יחיד למנהל( צריך לוודא שכאשר משנים מנהל מורידים את העובד מהרשימה המתאימה public abstract class AbstractEmployee implements Employee {... @Override public void setboss(manager newmanager) { if(getboss()!= null) getboss().removeemployee(this); this.boss = newmanager; if(getboss()!= null) getboss().addemployee(this);
25 פרטי מימוש... תמיכה ב- Hash (ניתן ל- eclipse נסתמך על שדה ה- id. לעשות את העבודה.) public abstract class AbstractEmployee implements Employee {... @Override public int hashcode() { final int prime = 31; int result = 1; result = prime * result + id; return result;
26 פרטי מימוש... תמיכה ב- Collections (ניתן ל- eclipse שוב, לעשות את העבודה.) נסתמך על שדה ה- id. public abstract class AbstractEmployee implements Employee {... public boolean equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (getclass()!= obj.getclass()) return false; AbstractEmployee other = (AbstractEmployee) obj; if (id!= other.id) return false; return true;
27 חישובי שכר למנהל חישוב שכר ייחודי public class Manager extends AbstractEmployee { @Override public double getsalary() { return employeefactor * employees.size();
28 חישובי שכר חישוב שכר עפ"י שכר בסיס public class TeamMember extends AbstractEmployee { private double wage; public TeamMember(int id, String name, Manager boss, double wage) { super(id, name, boss); this.wage = wage; @Override public double getsalary() { return wage;
29 חישובי שכר חישוב שכר עפ"י שכר בסיס + בונוס public class QATester extends TeamMember { private static double PER_BUG_BONUS = 100.0; private int bugsfound = 0; public QATester(int id, String name, Manager boss, double wage) { super(id, name, boss, wage); public void incrementbugs() {... public int getbugsfoubd() {... @Override public double getsalary() { return super.getsalary() + getbugsfound() * PER_BUG_BONUS;
30 עוד דרישות: כתבו תכנית המייצרת אובייקטים של עובדים עם נתונים אקראיים ושומרת אותם בשלוש רמות היררכיות לפי הפירוט הבא: בראש ההיררכיה נמצא המנכ"ל שהינו מנהל מתחתיו בהיררכיה יש 5 מנהלים מתחת לכל מנהל מצויים בהיררכיה 10 תכניתנים או בודקי תוכנה )בהסתברות שווה(. לאחר מכן, התוכנית תדפיס את פרטי 3 העובדים עם המשכורת הגבוהה ביותר בכל רמה היררכית.
31 דוגמא לפלט: CEO: ID: 1 Name: Taylor Zuckerberg Boss: None Salary: 49740.43 Employees: 5 Managers: ID: 13 Name: Kate Hewlett Boss: Taylor Zuckerberg Salary: 30395.94 Employees: 10 ID: 24 Name: Shlomo Noyce Boss: Taylor Zuckerberg Salary: 29222.68 Employees: 10 ID: 35 Name: Kate Filo Boss: Taylor Zuckerberg Salary: 25677.13 Employees: 10 Team members: ID: 32 Name: Max Noyce Boss: Kate Hewlett Salary: 20675.38 Language: Java ID: 40 Name: Lucy Jobs Boss: Max Ballmer Salary: 19595.35 Language: C++ ID: 16 Name: Imen Moore Boss: Shlomo Noyce Salary: 19509.67 Language: Ruby
33 public abstract class AbstractEmployee implements Employee {... @Override public String tostring() { StringBuilder str = new StringBuilder(); str.append("id: ").append(id); str.append("\tname: ").append(name); str.append("\tboss: "); if (getboss()!= null) str.append(getboss().getname()); else str.append("none"); str.append("\tsalary: "); str.append(string.format("%.2f",getsalary())); tostring() return str.tostring();
34 tostring() public class QATester extends TeamMember {... @Override public String tostring() { return super.tostring() + "\tbugs found: " + getbugsfound();
35 עוד דרישות: כתבו תכנית המייצרת אובייקטים של עובדים עם נתונים אקראיים ושומרת אותם בשלוש רמות היררכיות לפי הפירוט הבא: בראש ההיררכיה נמצא המנכ"ל שהינו מנהל מתחתיו בהיררכיה יש 5 מנהלים מתחת לכל מנהל מצויים בהיררכיה 10 תכניתנים או בודקי תוכנה )בהסתברות שווה(. לאחר מכן, התוכנית תדפיס את פרטי 3 העובדים עם המשכורת הגבוהה ביותר בכל רמה היררכית.
36 Sorting by salary נגדיר השוואה מתאימה: public class SalaryComparator implements Comparator<Employee> { @Override public int compare(employee o1, Employee o2) { return Double.compare(o2.getSalary(), o1.getsalary()); Reverse sort כעת נוכל לייצר את הדו"ח public static void printtoppaid(list<employee> employees) { Collections.sort(employees, new SalaryComparator()); for(int i=0; i<3; ++i) System.out.println(employees.get(i));
37 THE END הקוד נמצא במלואו באתר הקורס